﻿#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<locale.h>
#include<Windows.h>
#include<stdbool.h>

#define WALL L'□'
#define FOOD L'★'
#define BODY  L'●'

#define POS_X 24
#define POS_Y 5

#define KEY_PRESS(vk) ((GetAsyncKeyState(vk)&1 ? 1 : 0))

//枚举游戏状态
enum Game_status
{
	OK,//正常
	KILL_BY_WALL,//撞墙
	KILL_BY_SELF,//撞到自己
	END_NORMAL //正常退出
};
//枚举蛇的方向
enum Direction
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};
//蛇身节点类型
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;

//蛇的状态类型
typedef struct Snake
{
	pSnakeNode _phead;//指向蛇头的指针
	pSnakeNode _pfood;//指向食物的指针
	enum Direction _dir;//蛇的方向
	enum Game_status _status;//游戏的状态
	int _food_weight;//一个食物的分数
	int _score;//总分数
	int _sleep_time;//休息时间

}Snake,*pSnake;


//游戏的初始化
void Game_start(pSnake ps);
//打印欢迎界面
void WelcomeToGame();
//设置光标位置
void SetPos(short x, short y);
//打印地图
void CreatMap();
//初始化蛇
void InitSnake(pSnake ps);
//创建食物
void CreatFood(pSnake ps);
//游戏运行
void Game_run(pSnake ps);
//打印提示信息
void PrintHelp();
//暂停游戏
void Pause(pSnake ps);
//蛇的移动
void SnakeMove(pSnake ps);
//判断下一个位置是否是食物
int NextIsFood(pSnake ps, pSnakeNode next);
//下一个位置是食物
void EatFood(pSnake ps, pSnakeNode next);
//下一个位置不是食物
void NoFood(pSnake ps, pSnakeNode next);
//检测蛇是否撞墙
void KillByWall(pSnake ps);
//判断撞到自己
void KillBySelf(pSnake ps);
//游戏善后
void Game_end(pSnake ps);
